package com.shop.controller;

import com.shop.common.Result;
import com.shop.dto.OrderDTO;
import com.shop.entity.Order;
import com.shop.service.OrderService;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单管理控制器
 * 
 * 提供订单的创建、查询、状态更新和统计等功能，包括：
 * - 订单的增删查改
 * - 按会员、状态、时间区间等多维度查询订单
 * - 订单销售统计
 * 
 * @author Shop Management System
 * @version 1.0
 * @since 2024-01-01
 */
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    /**
     * 获取所有订单信息
     * 
     * 返回系统中所有订单的完整信息列表
     * 
     * @return Result<List<Order>> 订单信息列表
     * @apiNote 该接口会返回所有订单的基本信息，包括订单号、会员、金额、状态等
     */
    @GetMapping
    public Result<List<Order>> getAllOrders() {
        return Result.success(orderService.findAllOrders());
    }
    
    /**
     * 根据订单ID获取订单信息
     * 
     * 通过订单的唯一标识ID查询订单详细信息
     * 
     * @param id 订单ID，必填参数
     * @return Result<Order> 订单信息，如果不存在则data为null
     * @apiNote 如果指定的订单ID不存在，将返回404 Not Found状态码
     */
    @GetMapping("/{id}")
    public Result<Order> getOrderById(@PathVariable Long id) {
        Order order = orderService.findOrderById(id);
        return Result.success(order);
    }
    
    /**
     * 根据订单号获取订单信息
     * 
     * 通过订单号查询订单详细信息
     * 
     * @param orderNumber 订单号，必填参数
     * @return Result<Order> 订单信息，如果不存在则data为null
     * @apiNote 订单号查询常用于收银台快速查找订单
     */
    @GetMapping("/number/{orderNumber}")
    public Result<Order> getOrderByNumber(@PathVariable String orderNumber) {
        Order order = orderService.findOrderByNumber(orderNumber);
        return Result.success(order);
    }
    
    /**
     * 创建新订单
     * 
     * 创建新的订单记录，系统会自动生成订单号和创建时间
     * 
     * @param orderDTO 订单信息对象，包含会员、商品、金额等基本信息
     * @return Result<Order> 创建的订单信息
     * @apiNote 订单号由系统自动生成，确保唯一性
     */
    @PostMapping
    public Result<Order> createOrder(@RequestBody OrderDTO orderDTO) {
        Order order = orderService.createOrder(orderDTO);
        return Result.success(order);
    }
    
    /**
     * 更新订单状态
     * 
     * 根据订单ID更新订单的状态（如已支付、已发货、已完成等）
     * 
     * @param id 订单ID，必填参数
     * @param status 新的订单状态，必填参数
     * @return Result<Order> 更新后的订单信息
     * @apiNote 仅允许更新订单状态字段
     */
    @PutMapping("/{id}/status")
    public Result<Order> updateOrderStatus(@PathVariable Long id, @RequestParam String status) {
        orderService.updateOrderStatus(id, status);
        Order order = orderService.findOrderById(id);
        return Result.success(order);
    }
    
    /**
     * 根据会员ID获取订单列表
     * 
     * 查询指定会员的所有订单
     * 
     * @param memberId 会员ID，必填参数
     * @return Result<List<Order>> 该会员的订单列表
     * @apiNote 可用于会员订单历史查询
     */
    @GetMapping("/member/{memberId}")
    public Result<List<Order>> getOrdersByMember(@PathVariable Long memberId) {
        return Result.success(orderService.findOrdersByMemberId(memberId));
    }
    
    /**
     * 根据订单状态获取订单列表
     * 
     * 查询指定状态的所有订单
     * 
     * @param status 订单状态，必填参数
     * @return Result<List<Order>> 该状态下的订单列表
     * @apiNote 可用于订单管理和统计
     */
    @GetMapping("/status/{status}")
    public Result<List<Order>> getOrdersByStatus(@PathVariable String status) {
        return Result.success(orderService.findOrdersByStatus(status));
    }
    
    /**
     * 根据时间区间获取订单列表
     * 
     * 查询指定时间段内的所有订单
     * 
     * @param startDate 开始时间，必填参数，格式：yyyy-MM-dd'T'HH:mm:ss
     * @param endDate 结束时间，必填参数，格式：yyyy-MM-dd'T'HH:mm:ss
     * @return Result<List<Order>> 时间区间内的订单列表
     * @apiNote 可用于订单统计和报表
     */
    @GetMapping("/date-range")
    public Result<List<Order>> getOrdersByDateRange(
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate) {
        return Result.success(orderService.findOrdersByDateRange(startDate, endDate));
    }
    
    /**
     * 获取指定时间区间的订单总销售额
     * 
     * 查询指定时间段内所有订单的总销售金额
     * 
     * @param startDate 开始时间，必填参数，格式：yyyy-MM-dd'T'HH:mm:ss
     * @param endDate 结束时间，必填参数，格式：yyyy-MM-dd'T'HH:mm:ss
     * @return Result<Double> 总销售额
     * @apiNote 可用于销售统计和业绩分析
     */
    @GetMapping("/sales-summary")
    public Result<Double> getTotalSalesByDateRange(
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate) {
        Double totalSales = orderService.getTotalSalesByDateRange(startDate, endDate);
        return Result.success(totalSales);
    }

    /**
     * 控制层关于订单的删除操作
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result deleteOrderById(@PathVariable Long id) {
        orderService.deleteOrderById(id);
        return Result.success();
    }
} 